www.gusucode.com > vc++ 一个动感拉帘式TAB选项卡源码程序 > vc++ 一个动感拉帘式TAB选项卡源码程序\code\MyTab.cpp
// MyTab.cpp : implementation file // // Download by http://www.NewXing.com #include "stdafx.h" #include "MyTab.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CMyTab CMyTab::CMyTab() { m_itemcount=0; m_ptTabs.x=4; m_ptTabs.y=28; m_bMove=true; m_ispeed=10; } CMyTab::~CMyTab() { } BEGIN_MESSAGE_MAP(CMyTab, CTabCtrl) //{{AFX_MSG_MAP(CMyTab) ON_WM_TIMER() ON_NOTIFY_REFLECT(TCN_SELCHANGE, OnSelchange) ON_NOTIFY_REFLECT(TCN_SELCHANGING, OnSelchanging) ON_WM_CREATE() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CMyTab message handlers void CMyTab::AddItem(CWnd *pwnd, LPTSTR name) { TCITEM item; item.mask = TCIF_TEXT|TCIF_PARAM; item.lParam = (LPARAM) pwnd; item.pszText = name; InsertItem(m_itemcount, &item); pwnd->SetWindowPos(NULL, m_ptTabs.x, m_ptTabs.y , 0, 0, SWP_FRAMECHANGED | SWP_NOSIZE | SWP_NOZORDER); if(m_itemcount==0) { pwnd->ShowWindow(SW_SHOW);//显示第一个子窗体 } else { pwnd->ShowWindow(SW_HIDE); } m_itemcount++; } void CMyTab::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default CRect rect1; m_pCurWnd->GetWindowRect(&rect1); ScreenToClient(&rect1);//注意 GetWindowRect(&m_tabrect); ScreenToClient(&m_tabrect);//注意 if(rect1.left<4-m_ispeed) { rect1.TopLeft().x+=m_ispeed; rect1.BottomRight().x+=m_ispeed; m_pCurWnd->MoveWindow(&rect1,true); } else { rect1.TopLeft().x=4; rect1.BottomRight().x=4+m_wndwidth; m_pCurWnd->MoveWindow(&rect1,true);//移到初始位置 KillTimer(1); } CTabCtrl::OnTimer(nIDEvent); } void CMyTab::OnSelchange(NMHDR* pNMHDR, LRESULT* pResult) //单击选项卡后触发 { int iNewTab = GetCurSel(); TCITEM item; CWnd* pWnd; item.mask = TCIF_PARAM; //** show the selected tab -------- GetItem(iNewTab, &item); pWnd = reinterpret_cast<CWnd*> (item.lParam); ASSERT_VALID(pWnd); if(m_bMove) { CRect rect; pWnd->GetWindowRect(&rect); ScreenToClient(&rect);//注意 m_wndwidth=rect.Width(); m_topleft=rect.TopLeft(); m_bottomright=rect.BottomRight(); m_topleft.x-=rect.Width(); m_bottomright.x-=rect.Width(); rect.SetRect(m_topleft,m_bottomright); pWnd->MoveWindow(&rect,true);//将当前子窗体移到左边 pWnd->ShowWindow(SW_SHOW); m_pCurWnd=pWnd; SetTimer(1,10,NULL);//开始运动 } else pWnd->ShowWindow(SW_SHOW); *pResult = 0; } void CMyTab::OnSelchanging(NMHDR* pNMHDR, LRESULT* pResult) //单击选项卡时触发 { // TODO: Add your control notification handler code here int iNewTab = GetCurSel(); TCITEM item; CWnd* pWnd; item.mask = TCIF_PARAM; //** hide the current tab --------- GetItem(iNewTab, &item); pWnd = reinterpret_cast<CWnd*> (item.lParam); ASSERT_VALID(pWnd); pWnd->ShowWindow(SW_HIDE); *pResult = 0; } int CMyTab::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (CTabCtrl::OnCreate(lpCreateStruct) == -1) return -1; GetWindowRect(&m_tabrect); return 0; }